/**
 * 多种调用方式 —— 多态
 * 
 * 知识点
 *      1、面向对象编程的特性
 *          封装、继承、多态
 *      2、多态
 *          同一个方法多种调用方式
 */

 /**
  * 场景：add方法，不传参数则为0；传一个参数则返回10+参数；两个参数则返回a+b
  */
function add() {
    var arg = arguments,
        len = arg.length;
    switch(len) {
        case 0:
            return 0;
        case 1:
            return 10 + arg[0];
        case 2:
            return arg[0] + arg[1];
    }
}
//测试用例
console.log(add());//10
console.log(add(5));//15
console.log(add(6, 7));//13

/**
 * 另一种更优雅的方法
 */
function Add() {
    function zero() {
        return 0;
    }

    function one(num) {
        return 10 + num;
    }

    function two(num1, num2) {
        return num1 + num2;
    }

    this.add = function() {
        var arg = arguments,
            len = arg.length;
        switch(len) {
            case 0:
                return zero();
            case 1:
                return one(arg[0]);
            case 2:
                return two(arg[0], arg[1]);
        }
    };
}

var a = new Add();

console.log(a.add());
console.log(a.add(5));
console.log(a.add(6,7));

